import os
import hashlib
import time

def calculate_md5(filepath):
    """安全计算文件MD5"""
    try:
        with open(filepath, "rb") as f:
            file_content = f.read()
            return hashlib.md5(file_content).hexdigest()
    except Exception as e:
        print(f"计算MD5时出错 ({filepath}): {e}")
        return None

def create_modified_copy(dirpath):
    """创建修改后的文件副本而不是修改原文件"""
    timestamp = int(time.time() * 1000)
    # 将输出文件夹放在源文件夹内，避免权限问题
    output_dir = os.path.join(dirpath, "modified_copies")
    
    print(f"[信息] 源文件夹: {dirpath}")
    print(f"[信息] 准备创建输出文件夹: {output_dir}")
    
    try:
        os.makedirs(output_dir, exist_ok=True)
        print(f"[信息] 输出文件夹创建成功或已存在。")
    except Exception as e:
        print(f"[错误] 无法创建输出文件夹 '{output_dir}': {e}")
        print("请检查文件夹权限或路径是否正确。")
        return
    
    supported_extensions = {'.png', '.jpg', '.jpeg', '.mp3', '.ttf', '.otf'}
    files_found = 0
    files_copied = 0
    
    print(f"[信息] 开始遍历目录...")
    
    try:
        for root, dirs, files in os.walk(dirpath):
            # 跳过我们自己创建的modified_copies文件夹，避免递归操作
            if 'modified_copies' in dirs:
                dirs.remove('modified_copies')
                print(f"[信息] 已跳过 'modified_copies' 目录。")
            
            for file in files:
                files_found += 1
                filepath = os.path.join(root, file)
                # 使用os.path.splitext正确获取小写扩展名
                _, ext = os.path.splitext(file)
                ext = ext.lower()
                
                if ext in supported_extensions:
                    print(f"[信息] 找到支持的文件: {file}")
                    
                    # 计算原文件MD5
                    original_md5 = calculate_md5(filepath)
                    if original_md5 is None:
                        continue  # 如果计算MD5失败，跳过此文件
                    
                    # 创建修改后的副本
                    new_filename = f"{file}"
                    new_filepath = os.path.join(output_dir, new_filename)
                    
                    try:
                        # 复制文件并添加时间戳
                        with open(filepath, "rb") as original:
                            content = original.read()
                        
                        with open(new_filepath, "wb") as modified:
                            modified.write(content)
                            modified.write(str(timestamp).encode())
                        
                        # 计算新MD5
                        new_md5 = calculate_md5(new_filepath)
                        if new_md5 is None:
                            continue
                        
                        files_copied += 1
                        print(f"  原MD5: {original_md5}")
                        print(f"  副本文件: {new_filename}")
                        print(f"  新MD5: {new_md5}")
                        print("-" * 50)
                        
                    except Exception as e:
                        print(f"[错误] 复制文件时出错 ({filepath}): {e}")
                else:
                    print(f"[跳过] 不支持的文件类型: {file} (扩展名: {ext})")
    except Exception as e:
        print(f"[错误] 遍历目录时发生未知错误: {e}")
        return
    
    print(f"\n[总结] 总共找到 {files_found} 个文件，成功创建了 {files_copied} 个文件的副本。")
    if files_copied > 0:
        print(f"修改后的文件副本已保存到: {output_dir}")
    else:
        print("未能成功创建任何文件副本，请根据上述提示排查问题。")

if __name__ == '__main__':
    print("文件MD5修改工具 (安全副本模式)")
    dirpath = input("请输入包含图片、音频或字体文件的文件夹路径: ").strip()
    
    # 去除路径可能的引号
    dirpath = dirpath.strip('"\'')
    
    if not os.path.isdir(dirpath):
        print(f"[错误] 路径 '{dirpath}' 不存在或不是一个文件夹。")
    else:
        create_modified_copy(dirpath)
    input("\n按Enter键退出...")